<?php

/**
 * 连接的数据库
 */
function dr_db_connect()
{
    $connection = mysql_connect(DR_DB_HOST, DR_DB_USERNAME, DR_DB_PASSWORD);
    mysql_query('SET NAMES UTF8');

    // 选择数据库
    if (is_resource($connection)) {
        if (!mysql_select_db(DR_DB_NAME, $connection)) {
            die('选择数据库时出错');
        }
    } else {
        die('连接数据库时出错');
    }

    return $connection;
}



/*
 执行指定的SQL查询语句，其中参数必须是完整的sql语句
 返回：数据库查询的结果
 */
function dr_db_query_raw($db, $query)
{
    global $dr_db_fail_handler;

    $result = mysql_query($query, $db);

    if ($result === false) {
        die('执行数据库查询时失败');
    }

    return $result;
}


/*
 将输入的数据(数组或变量)转义为安全的形式
 返回：安全形式的mysql字符串
 */
function dr_db_argument_to_mysql($db, $argument, $alwaysquote = false, $arraybrackets = false)
{
    if (is_array($argument)) { // 参数为数组的情况

        $parts = array();

        //如果是多维数组，则采用递归来解析数组
        foreach ($argument as $subargument) {
            $parts[] = dr_db_argument_to_mysql($db, $subargument, $alwaysquote, true);
        }

        if ($arraybrackets) {
            $result = '(' . implode(',', $parts) . ')';
        } else {
            $result = implode(',', $parts);
        }

    } elseif (isset($argument)) { // 参数不是array
        if ($alwaysquote)
            $result = '\'' . mysql_real_escape_string($argument, $db) . '\'';
        else
            $result = mysql_real_escape_string($argument, $db);
    } else { // 参数未定义

        $result = 'NULL';

    }

    return $result;
}

/*
 将输入的参数和SQL语句模板转换为安全合法的SQL语句
 将通配符替换为具体的数据
 @^ 替换为 表前缀
 @$ 字符串替换
 @#数字类型替换
 返回：将各种符号替换后的完整sql语句
 */
function dr_db_apply_sub($db, $query, $arguments)
{
    $query = strtr($query, array('^' => DR_DB_TABLE_PREFIX));

    if (is_array($arguments)) {
        $countargs = count($arguments);
        $offset = 0;
        //循环将^$#符号一个个替换掉
        for ($argument = 0; $argument < $countargs; $argument++) {
            $stringpos = strpos($query, '$', $offset);
            $numberpos = strpos($query, '#', $offset);

            if (($stringpos === false) || (($numberpos !== false) && ($numberpos < $stringpos))) {
                $alwaysquote = false;
                $position = $numberpos;
            } else {
                $alwaysquote = true;
                $position = $stringpos;
            }

            if (!is_numeric($position)) {
                dr_fatal_error('Insufficient parameters in query123: ' . $query);
            }

            $value = dr_db_argument_to_mysql($db, $arguments[$argument], $alwaysquote);
            $query = substr_replace($query, $value, $position, 1);
            $offset = $position + strlen($value);
        }
    }

    return $query;
}

/*
 执行查询SQL语句，首先需要替换其中的^#$标识符
 返回：返回sql语句执行后的结果
 */
function dr_db_query_sub($db, $query)
{
    // 获得其余的参数,将参数构建成数组
    $funcargs = func_get_args();

    return dr_db_query_raw($db, dr_db_apply_sub($db, $query, array_slice($funcargs, 2))); //将数组前两个切割掉
}


/*
 返回：一个随机的整数，该数在bigint类型的字段中使用
 */
function dr_db_random_bigint()
{
    return sprintf('%d%06d%06d', mt_rand(1, 18446743), mt_rand(0, 999999), mt_rand(0, 999999));
}


/*
 返回：$result资源中key和value字段对应结果组织成数组，key=>value形式
 */
function dr_db_read_all_assoc($result, $key, $value)
{
    // $result不是资源
    if (!is_resource($result))
        dr_fatal_error('Reading all assoc from invalid result');
    $assocs = array();

    while ($assoc = mysql_fetch_assoc($result)) {
        $assocs[$assoc[$key]] = isset($value) ? $assoc[$value] : $assoc;
    }
    mysql_free_result($result);
    return $assocs;
}

/*
 返回：$result资源中的第一个记录，以关联数组的形式返回
 */
function dr_db_read_one_assoc($result, $allowempty = true)
{
    if (!is_resource($result))
        dr_fatal_error('Reading one assoc from invalid result');

    $assoc = mysql_fetch_assoc($result);

    if (!is_array($assoc)) {
        if ($allowempty)
            return null;
        else
            dr_fatal_error('Reading one assoc from empty results');
    }
    mysql_free_result($result);
    return $assoc;
}

/*
 返回：查询记录的第一列数据，以数组的形式返回
 */
function dr_db_read_all_values($result)
{
    if (!is_resource($result))
        dr_fatal_error('Reading column from invalid result');

    $output = array();

    while ($row = mysql_fetch_row($result))
        $output[] = $row[0];

    mysql_free_result($result);
    return $output;
}

/*
 返回：$result中的第一行的第一列，即一个数据
 */
function dr_db_read_one_value($result, $allowempty = true)
{
    if (!is_resource($result))
        dr_fatal_error('Reading one value from invalid result');
    $row = mysql_fetch_row($result);
    if (!is_array($row)) {
        if ($allowempty)
            return null;
        else
            dr_fatal_error('Reading one value from empty results');
    }
    mysql_free_result($result);
    // 返回数组的第一列
    return $row[0];
}


/*
 返回：最后一次insert插入操作中auto_increment列的内容
 */
function dr_db_last_insert_id($db)
{
    return dr_db_read_one_value(dr_db_query_raw($db, 'SELECT LAST_INSERT_ID()'));
}



/*
 忽略PHP的结束标志可以避免不必要的输出内容
 */
